﻿#pragma once

#include "GLLSingleton.h"
#include "GLLTimer.h"

namespace GLL
{	
	class GameState;
	class String;
	class System;
	class VirtualWorld;
	class Console;
	class ResMgr;
	class Input;
	class LevelManager;

	/**一个游戏，从大局来看，就是一些系统和一些状态。
	系统如：渲染，人机输入（鼠键），声音等等。
	所谓“应用”就是这些状态和系统的管理器。
	*/
	class GameApp
	{
	public:
		/**游戏开始.
		called by OSApp*/
		void _Start(GameState& startState);

		/**时间停止.*/
		void Pause();

		/**时间回复.*/
		void Resume();

		///改变游戏状态
		void ChangeState( GameState& gameState );

		/**关闭游戏程序.
		关闭按钮按下，或其他游戏自定义退出事件发生时，调用*/
		void Shutdown();

		/**.*/
		void Update();

		/**游戏是否结束.*/
		bool IsGameExiting(){return _Exit;}

		/**帧率.*/
		float GetFPS(){return _FPS;}

		/**平均帧率.*/
		float GetFPSAverage(){return _FPSAve;}

		/**最大帧率.*/
		void SetMaxFPS(int);

	private:

		/**两次调用间隔.*/
		TimeMS GetTimeInterval();

		///清理游戏资源
		void Cleanup();

		void Init();

		/** .*/
		void DestorySystem(System*);

		/** .*/
		Console* _new_Console();

		/** .*/
		VirtualWorld* _new_VirtualWorld();

		/** .*/
		ResMgr* _new_ResMgr();

		/** .*/
		Input* _new_Input();

		/** .*/
		void SlowDownFPS(TimeMS);

		/** .*/
		void SetFPS(TimeMS);

	protected:
		bool _Paused;

		///当前状态
		GameState* _currentGS;
		///是否"被结束"
		bool _Exit;
		///计数器
		Timer _timer;
		///是否需要创建控制台
		bool _hasConsole;
		//各种系统：
		Console* _console;

		//只能表达49.7天，客户端应该够用了
		TimeMS _timeStamp;

	public:
		VirtualWorld* _3DWorld;
		Input* _input;
		ResMgr* _resMgr;
		TimeMS _maxMS; ///<每帧最大用时.
		float _FPS; ///<上一帧帧率.
		float _FPSAve;///<平均帧率.

		///构造
		GameApp( bool console = false );

		///析构
		virtual ~GameApp( void );
	};

}
